/*
 * Copyright 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.privacysandbox.ads.adservices.appsetid

import android.annotation.SuppressLint
import android.os.Build
import android.os.ext.SdkExtensions
import androidx.annotation.DoNotInline
import androidx.annotation.RequiresExtension
import androidx.annotation.RestrictTo
import androidx.core.os.asOutcomeReceiver
import kotlinx.coroutines.suspendCancellableCoroutine

@RestrictTo(RestrictTo.Scope.LIBRARY)
@SuppressLint("ClassVerificationFailure", "NewApi")
@RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 4)
@RequiresExtension(extension = Build.VERSION_CODES.S, version = 9)
open class AppSetIdManagerImplCommon(
    private val mAppSetIdManager: android.adservices.appsetid.AppSetIdManager
) : AppSetIdManager() {

    @DoNotInline
    override suspend fun getAppSetId(): AppSetId {
        return convertResponse(getAppSetIdAsyncInternal())
    }

    private suspend fun getAppSetIdAsyncInternal(): android.adservices.appsetid.AppSetId =
        suspendCancellableCoroutine {
                continuation ->
            mAppSetIdManager.getAppSetId(
                Runnable::run,
                continuation.asOutcomeReceiver()
            )
        }

    private fun convertResponse(response: android.adservices.appsetid.AppSetId): AppSetId {
        if (response.scope == android.adservices.appsetid.AppSetId.SCOPE_APP) {
            return AppSetId(response.id, AppSetId.SCOPE_APP)
        }
        return AppSetId(response.id, AppSetId.SCOPE_DEVELOPER)
    }
}
